/**
 * @file DisplayManager.cpp
 * @brief OLED显示屏管理类实现
 */

#include "DisplayManager.h"

// EEPROM地址定义
#define DISPLAY_STATE_ADDR 228  // 在MQTT配置之后
#define DISPLAY_INTERVAL_ADDR 229   // 屏幕间隔存储地址

DisplayManager::DisplayManager()
  : display(128, 64, &Wire, -1) {
  wifiStrength = 0;
  lastTemperature = -100;  // 初始化为不可能的值，用于第一次比较
  lastHumidity = -100;     // 初始化为不可能的值，用于第一次比较
  displayOn = true;        // 默认屏幕开启
  displayInterval = 1000;  // 默认屏幕更新间隔1秒
}

bool DisplayManager::init() {
  Serial.println("Initializing OLED display...");

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("SSD1306 allocation failed");
    return false;
  }

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);

  // 从EEPROM加载屏幕状态
  if (!loadDisplayState()) {
    // 如果加载失败，使用默认开启状态
    displayOn = true;
    Serial.println("Using default display state: ON");
  } else {
    Serial.print("Display state loaded from EEPROM: ");
    Serial.println(displayOn ? "ON" : "OFF");
  }

  // 从EEPROM加载屏幕间隔
  if (!loadDisplayInterval()) {
    // 如果加载失败，使用默认间隔
    displayInterval = 1000;
    Serial.println("Using default display interval: 1000ms");
  } else {
    Serial.print("Display interval loaded from EEPROM: ");
    Serial.println(displayInterval);
  }

  // 根据加载的状态设置屏幕
  if (displayOn) {
    turnOn();
  } else {
    turnOff();
  }

  Serial.println("OLED display initialized successfully");
  return true;
}

bool DisplayManager::loadDisplayInterval() {
  if (!EEPROM.begin(512)) {
    Serial.println("EEPROM initialization failed, cannot load display interval");
    return false;
  }

  // 从4个字节重组unsigned long
  uint32_t interval = 0;
  interval |= (uint32_t)EEPROM.read(DISPLAY_INTERVAL_ADDR) << 24;
  interval |= (uint32_t)EEPROM.read(DISPLAY_INTERVAL_ADDR + 1) << 16;
  interval |= (uint32_t)EEPROM.read(DISPLAY_INTERVAL_ADDR + 2) << 8;
  interval |= EEPROM.read(DISPLAY_INTERVAL_ADDR + 3);
  
  EEPROM.end();

  // 检查读取的值是否有效
  if (interval >= 100 && interval <= 60000) {
    displayInterval = interval;
    return true;
  } else {
    // 无效值，使用默认间隔
    Serial.println("Invalid display interval in EEPROM, using default interval");
    return false;
  }
}

// 新增屏幕间隔控制方法
void DisplayManager::setDisplayInterval(unsigned long interval) {
  // 验证间隔值有效性
  if (interval < 100) {
    Serial.println("Display interval too short, using minimum 100ms");
    displayInterval = 100;
  } else if (interval > 60000) {
    Serial.println("Display interval too long, using maximum 60000ms");
    displayInterval = 60000;
  } else {
    displayInterval = interval;
  }
  
  Serial.print("Display interval set to: ");
  Serial.print(displayInterval);
  Serial.println("ms");
  
  // 保存到EEPROM
  saveDisplayInterval();
}

unsigned long DisplayManager::getDisplayInterval() {
  return displayInterval;
}

void DisplayManager::saveDisplayInterval() {
  if (!EEPROM.begin(512)) {
    Serial.println("EEPROM initialization failed, cannot save display interval");
    return;
  }

  // 将4字节的unsigned long拆分为4个字节存储
  uint32_t interval = displayInterval;
  EEPROM.write(DISPLAY_INTERVAL_ADDR, (interval >> 24) & 0xFF);
  EEPROM.write(DISPLAY_INTERVAL_ADDR + 1, (interval >> 16) & 0xFF);
  EEPROM.write(DISPLAY_INTERVAL_ADDR + 2, (interval >> 8) & 0xFF);
  EEPROM.write(DISPLAY_INTERVAL_ADDR + 3, interval & 0xFF);

  if (EEPROM.commit()) {
    Serial.print("Display interval saved: ");
    Serial.println(displayInterval);
  } else {
    Serial.println("Failed to save display interval");
  }

  EEPROM.end();
}



void DisplayManager::saveDisplayState() {
  if (!EEPROM.begin(512)) {
    Serial.println("EEPROM initialization failed, cannot save display state");
    return;
  }

  EEPROM.write(DISPLAY_STATE_ADDR, displayOn ? 1 : 0);

  if (EEPROM.commit()) {
    Serial.print("Display state saved: ");
    Serial.println(displayOn ? "ON" : "OFF");
  } else {
    Serial.println("Failed to save display state");
  }

  EEPROM.end();
}

bool DisplayManager::loadDisplayState() {
  if (!EEPROM.begin(512)) {
    Serial.println("EEPROM initialization failed, cannot load display state");
    return false;
  }

  uint8_t savedState = EEPROM.read(DISPLAY_STATE_ADDR);
  EEPROM.end();

  // 检查读取的值是否有效
  if (savedState == 0 || savedState == 1) {
    displayOn = (savedState == 1);
    return true;
  } else {
    // 无效值，使用默认状态
    Serial.println("Invalid display state in EEPROM, using default state");
    return false;
  }
}

void DisplayManager::showStatus(String line1, String line2, String line3) {
  if (!displayOn) return;  // 如果屏幕关闭，不显示任何内容

  display.clearDisplay();

  // 显示主要状态信息
  display.setCursor(0, 0);
  display.println(line1);

  if (line2 != "") {
    display.setCursor(0, 20);
    display.println(line2);
  }

  if (line3 != "") {
    display.setCursor(0, 40);
    display.println(line3);
  }

  display.display();
}

/**
 * @brief 格式化字符串，只保留字母、数字和破折号
 * @param s 输入字符串
 * @return 格式化后的字符串
 */
String formatStr(String s) {
  String result;
  for (int i = 0; i < s.length(); i++) {
    (isAlpha(s[i]) || isdigit(s[i]) || s[i] == '-') ? result += s[i] : result += '*';
  }
  return (result.length() > 8) ? result.substring(0, 8) + "..." : result;
}

void DisplayManager::showSimpleWeatherData(float temperature, float humidity, int rssi, 
                                          bool wifiConnected, bool mqttConnected, String wifiName) {
  // 如果屏幕关闭，不显示任何内容
  if (!displayOn) return;

  display.clearDisplay();

  // 顶部状态栏 - 简约风格
  display.setTextSize(1);

  if (wifiConnected) {
    // WiFi已连接时的显示
    // 左上角：WiFi名称
    display.setCursor(0, 5);
    display.print("WiFi:");
    display.print(formatStr(wifiName));

    // 右上角：WiFi信号强度百分比
    int wifiPercent = map(constrain(rssi, -100, -50), -100, -50, 0, 100);
    display.setCursor(102, 5);
    display.print(wifiPercent);
    display.print("%");
  } else {
    // WiFi断开时的显示
    display.setCursor(0, 5);
    display.print("WiFi:Disconnected");
  }

  // 顶部横线
  display.drawFastHLine(0, 15, 128, SSD1306_WHITE);

  // 温度显示 - 大字体，左侧
  display.setTextSize(1);
  display.setCursor(8, 20);
  display.print("Temp");

  display.setTextSize(2);
  display.setCursor(8, 30);
  display.print(temperature, 1);
  display.setTextSize(1);
  display.print("C");

  // 湿度显示 - 大字体，右侧
  display.setTextSize(1);
  display.setCursor(70, 20);
  display.print("Hum");

  display.setTextSize(2);
  display.setCursor(70, 30);
  display.print(humidity, 1);
  display.setTextSize(1);
  display.print("%");

  // 在温度下方显示变化指示符
  if (lastTemperature != -100) {
    float currentTempRounded = round(temperature * 10) / 10.0;
    float lastTempRounded = round(lastTemperature * 10) / 10.0;

    if (currentTempRounded > lastTempRounded) {
      display.setCursor(56, 39);
      display.print("+");
    } else if (currentTempRounded < lastTempRounded) {
      display.setCursor(56, 39);
      display.print("-");
    }
  }

  // 在湿度下方显示变化指示符
  if (lastHumidity != -100) {
    float currentHumRounded = round(humidity * 10) / 10.0;
    float lastHumRounded = round(lastHumidity * 10) / 10.0;

    if (currentHumRounded > lastHumRounded) {
      display.setCursor(118, 39);
      display.print("+");
    } else if (currentHumRounded < lastHumRounded) {
      display.setCursor(118, 39);
      display.print("-");
    }
  }

  // 底部横线
  display.drawFastHLine(0, 50, 128, SSD1306_WHITE);

  // 底部状态栏
  if (wifiConnected) {
    // WiFi已连接时的底部显示
    display.setCursor(0, 54);
    display.print(rssi);
    display.print("dBm");

    display.setCursor(85, 54);
    display.print(mqttConnected ? "Online" : "Offline");
  } else {
    // WiFi断开时的底部显示
    display.setCursor(0, 54);
    display.print("Reconnecting");
  }

  display.display();

  // 保存当前值作为下一次的"上一次值"
  lastTemperature = temperature;
  lastHumidity = humidity;
}

void DisplayManager::clear() {
  if (!displayOn) return;  // 如果屏幕关闭，不执行清屏操作
  display.clearDisplay();
  display.display();
}

void DisplayManager::turnOn() {
  if (displayOn) return;  // 如果已经是开启状态，直接返回

  displayOn = true;
  display.ssd1306_command(SSD1306_DISPLAYON);  // 发送开启显示命令
  Serial.println("Display turned ON");

  // 立即刷新一次显示，确保内容可见
  display.display();
}

void DisplayManager::turnOff() {
  if (!displayOn) return;  // 如果已经是关闭状态，直接返回

  displayOn = false;
  display.clearDisplay();
  display.display();
  display.ssd1306_command(SSD1306_DISPLAYOFF);  // 发送关闭显示命令
  Serial.println("Display turned OFF");
}

void DisplayManager::toggle() {
  if (displayOn) {
    turnOff();
  } else {
    turnOn();
  }

  // 切换状态后立即保存
  saveDisplayState();
}

bool DisplayManager::isDisplayOn() {
  return displayOn;
}

void DisplayManager::updateWifiStrength(int rssi) {
  // 将RSSI值转换为信号强度等级 (0-4)
  if (rssi >= -50) {
    wifiStrength = 4;  // 优秀
  } else if (rssi >= -60) {
    wifiStrength = 3;  // 良好
  } else if (rssi >= -70) {
    wifiStrength = 2;  // 一般
  } else if (rssi >= -80) {
    wifiStrength = 1;  // 差
  } else {
    wifiStrength = 0;  // 非常差或无信号
  }
}

void DisplayManager::forceRefresh() {
  if (displayOn) {
    display.display(); // 只在屏幕开启时强制刷新
  }
}